package com.edee.bigday.ssoclient.controller;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.client.RestTemplate;

import javax.servlet.http.HttpSession;
import java.util.ArrayList;
import java.util.List;

@Controller
public class SsoClientController {
    @Value("${sso.server.url}")
    String ssoServerUrl;

    /**
     * 无需登录即可访问
     *
     * @return
     */
    @ResponseBody
    @GetMapping("/hello")
    public String hello() {
        return "hello";
    }

    /**
     * 需要能够感知当前请求是否已经在ssoserver中登录成功后跳转回来的，方法如下：
     *  1、将登录成功的用户信息保存到Redis或者session中；
     *  2、将登录成功的用户信息作为参数(如下面的token)添加到重定向的url中。
     * @param model
     * @param session
     * @param token   如果请求已经在ssoserver中登录成功，就会带着该参数作为登录成功标识
     * @return
     */
    @GetMapping("/employees")
    public String employees(Model model, HttpSession session,
                            @RequestParam(value = "token", required = false) String token) {
        model.addAttribute("loginUser", "John Higgins");
        if (!StringUtils.isEmpty(token)) {
            //已经在ssoserver中登录成功：
            //TODO 1、从ssoserver中获取当前token对应的真实用户信息(已在下面使用RestTemplate的功能解决)：
            //不能使用OpenFeign，因为有些系统可能是其它语言写的。
            //可以依赖common之后，使用HttpUtils工具类中的功能。现使用Spring（org.springframework.web.client.RestTemplate）提供的RestTemplate：
            RestTemplate restTemplate = new RestTemplate();
            //下面发送/userInfo请求，通过LoginController中的@GetMapping("/userInfo")从Redis中获取真正的登录用户信息：
            ResponseEntity<String> forEntity = restTemplate.getForEntity("http://ssoserver.com:8080/userInfo?token=" + token, String.class);
            String body = forEntity.getBody();
            //在session中存放真实的用户信息（2021.03.25--client1）
            session.setAttribute("loginUser",body);
            //先模拟一个用户(2021.03.24--client1)：
            //session.setAttribute("loginUser", "John Higgins");
            //model.addAttribute("loginUser","John Higgins");  //移至if判断外面
        }
        Object loginUser = session.getAttribute("loginUser");
        if (loginUser == null) {
            //未登录，跳转到认证服务器进行登录。跳转时，带上跳转前页面的url。即带上查询参数redirect_url标识
            // 跳转前的页面：
            return "redirect:" + ssoServerUrl + "?redirect_url=http://client1.com:8081/employees";
        } else {
            List<String> emps = new ArrayList<>();
            emps.add("Byden");
            emps.add("Blinkon");
            emps.add("Mr. Bean");
            model.addAttribute("emps", emps);
            return "list";
        }
    }
}
